import warning from 'warning'

let scrollbarSize

// Measure scrollbar width for padding body during modal show/hide
const scrollbarMeasure = {
  position: 'absolute',
  top: '-9999px',
  width: '50px',
  height: '50px',
  overflow: 'scroll',
}

export function measureScrollbar (direction = 'vertical') {
  if (typeof document === 'undefined' || typeof window === 'undefined') {
    return 0
  }
  if (scrollbarSize) {
    return scrollbarSize
  }
  const scrollDiv = document.createElement('div')
  Object.keys(scrollbarMeasure).forEach(scrollProp => {
    scrollDiv.style[scrollProp] = scrollbarMeasure[scrollProp]
  })
  document.body.appendChild(scrollDiv)
  let size = 0
  if (direction === 'vertical') {
    size = scrollDiv.offsetWidth - scrollDiv.clientWidth
  } else if (direction === 'horizontal') {
    size = scrollDiv.offsetHeight - scrollDiv.clientHeight
  }

  document.body.removeChild(scrollDiv)
  scrollbarSize = size
  return scrollbarSize
}

export function debounce (func, wait, immediate) {
  let timeout
  function debounceFunc (...args) {
    const context = this
    // https://fb.me/react-event-pooling
    if (args[0] && args[0].persist) {
      args[0].persist()
    }
    const later = () => {
      timeout = null
      if (!immediate) {
        func.apply(context, args)
      }
    }
    const callNow = immediate && !timeout
    clearTimeout(timeout)
    timeout = setTimeout(later, wait)
    if (callNow) {
      func.apply(context, args)
    }
  }
  debounceFunc.cancel = function cancel () {
    if (timeout) {
      clearTimeout(timeout)
      timeout = null
    }
  }
  return debounceFunc
}

const warned = {}
export function warningOnce (condition, format, args) {
  if (!warned[format]) {
    warning(condition, format, args)
    warned[format] = !condition
  }
}

export function remove (array, item) {
  const index = array.indexOf(item)
  const front = array.slice(0, index)
  const last = array.slice(index + 1, array.length)
  return front.concat(last)
}
